package config

import (
	"aimemo/model"         // 导入项目的数据模型包，用于数据库表结构映射
	"gorm.io/driver/mysql" // 导入Gorm的MySQL驱动，用于连接MySQL数据库
	"gorm.io/gorm"         // 导入Gorm框架核心包，提供ORM功能
)

// DB 全局数据库连接实例
// 其他包可以通过 config.DB 直接访问数据库，避免重复创建连接
var DB *gorm.DB

// InitDB 初始化数据库连接并自动迁移数据表结构
// 返回 error 类型，用于告知调用者初始化是否成功
func InitDB() error {
	// 定义MySQL连接字符串（DSN）
	// 格式：用户名:密码@tcp(数据库地址:端口)/数据库名?参数1&参数2...
	// 这里的参数说明：
	// - root:lrx563647：MySQL的用户名（root）和密码（lrx563647）
	// - tcp(127.0.0.1:3306)：数据库地址（本地127.0.0.1）和端口（默认3306）
	// - ai_memo：要连接的数据库名（需提前创建）
	// - charset=utf8mb4：使用utf8mb4字符集，支持emoji等特殊字符
	// - parseTime=True：让Gorm正确解析MySQL的时间类型（datetime）
	// - loc=Local：使用本地时区解析时间
	dsn := "root:lrx563647@tcp(127.0.0.1:3306)/ai_memo?charset=utf8mb4&parseTime=True&loc=Local"

	// 调用gorm.Open连接MySQL数据库
	// 参数1：mysql.Open(dsn)：指定使用MySQL驱动并传入连接字符串
	// 参数2：&gorm.Config{}：Gorm的配置选项（这里使用默认配置）
	// 返回值：*gorm.DB（数据库连接实例）和 error（连接错误）
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		// 连接失败时返回错误，由调用者处理（如程序退出）
		return err
	}

	// 自动迁移数据表结构
	// 作用：根据model.Task结构体自动创建或更新数据库中的tasks表
	// 如果表不存在，会根据结构体字段创建表；如果表已存在，会对比字段差异并更新（不会删除字段）
	err = db.AutoMigrate(&model.Task{})
	if err != nil {
		// 迁移失败时返回错误
		return err
	}

	// 将连接实例赋值给全局变量DB，供其他包使用
	DB = db
	// 初始化成功，返回nil
	return nil
}
